package cn.mesmile.thread;

/**
 * @author zb
 * @date 2020/12/31 15:15
 * @Description
 *
 *  【wait】必须使用在同步代码块或者同步方法中
 *
 *  wait()    一旦执行此方法，当前线程就进入阻塞状态，并释放同步监视器
 *  notify	一旦执行此方法，就会唤醒被wait的一个线程，如果有多个线程，就唤醒优先级高的线程
 *  notifyAll	一旦执行此方法，就会唤醒所有被wait()的线程
 */
public class ThreadCrossing {

    /**
     *   【 sleep 和 wait 】
     * 相同点：一旦执行方法以后，都会使得当前的进程进入阻塞状态
     * 不同点：
     *  1.两个方法声明的位置不同，Thread类中声明sleep，Object类中声明wait。
     *  2.调用的要求不同，sleep可以在任何需要的场景下调用，wait必须使用在同步代码块或者同步方法中
     *  3.关于是否释放同步监视器，如果两个方法都使用在同步代码块或同步方法中，sleep不会释放，wait会释放
     */

    public static void main(String[] args) {
        Number number = new Number();

        Thread t1 = new Thread(number);
        Thread t2 = new Thread(number);

        t1.setName("线程1");
        t2.setName("线程2");

        t1.start();
        t2.start();
    }

}

class Number implements Runnable{

    private static int number = 0;


    /**
     *  【wait】必须使用在同步代码块或者同步方法中
     *      使用 notify 和 wait 方法来实现交替执行线程
     */

    @Override
    public synchronized void run() {
        while (true){
            // ①、先唤醒线程
            this.notify();
            if (number < 100){
                System.out.println("Thread.currentThread().getName() = " + Thread.currentThread().getName());
                number++;
                try {
                    // ②、再阻塞线程
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }else {
                break;
            }
        }
    }


}